package util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

import peca.CorPeca;
import peca.Rei;
import util.robo.Robo;
import estrutura.Celula;
import estrutura.Peca;

public class Relatorio {
	
	public static void relatorio(CorPeca cor,  Celula[][] celulas){
		
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
					Celula celula = celulas[x][y]; 
					Peca peca = celula.getPeca();
					if(peca != null && peca.getCor() == cor){
						System.out.println(peca.getNome());
						selecionarJogadasPossiveis(celula, celulas);	
					}
				}
			}
		}
	
	
	/**
	 * TODO Falta implementar
	 * simula resultado jogada
	 * 
	 * @param cor
	 * @param celulas
	 */
	
	public static String simulaJogada(CorPeca cor,  Celula[][] celulas){
		Map<String, Integer> jogadas = new HashMap<String, Integer>();
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
				Celula celula = celulas[x][y]; 
				Peca peca = celula.getPeca();
				if(peca != null && peca.getCor() == cor){
					jogadas.putAll(selecionarJogadasPossiveis(celula, celulas));
				}
			}
		}
		int maior = -1;
		String chave ="";
		 for (Iterator it = jogadas.keySet().iterator(); it.hasNext();) {  
	            String key = String.valueOf(it.next());  
	            int item = jogadas.get(key);		    
	            if(item > maior){
	            	chave = key;		
	            	maior = item;
	            }
		 }
		 
		 if(maior == 0){
			 Random randomico = new Random();
			 int valor = randomico.nextInt(jogadas.size()-1);
			 
			int cont = 0;
			
			 for (Iterator it = jogadas.keySet().iterator(); it.hasNext();) {  
		            chave = String.valueOf(it.next());  
		            if(cont == valor){
		            	break;
		            }
		            cont++;
			 }
		 }
		 
		 for (int i = 0; i < 8; i++) {
				String linha = "";
				for (int j = 0; j < 8; j++) {
					linha += getFormato(celulas[i][j].getPeca()!=null? celulas[i][j].getPeca().getNome() : null) + " ";
				}
			}
		return chave;
	}
	
	
	
	public static Map<String, Integer> selecionarJogadasPossiveis(Celula origem,  Celula[][] celulas){
		Map<String, Integer> jogadas = new HashMap<String, Integer>();
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
				if(origem.getPeca().isMovimentoValido(origem, celulas[x][y], celulas)){
					if(celulas[x][y].getPeca() != null ){
					//	System.out.println("["+origem.getPosicao()+" "+x+""+y+"]" + "Come:["+celulas[x][y].getPeca().getNome() +"]");
					}else{
					//	System.out.println("["+origem.getPosicao()+" "+x+""+y+"]");
					}
					jogadas.put(origem.getPosicao()+" "+x+""+y, Robo.pesoPeca(celulas[x][y].getPeca()));
				}
			}
		}
		return jogadas;
	}
	
	
	private static boolean xeque(Celula origem,  Celula[][] celulas){
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
				if(origem.getPeca().isMovimentoValido(origem, celulas[x][y], celulas)){
					if(celulas[x][y].getPeca() != null ){
						if(celulas[x][y].getPeca() instanceof Rei){
							return true;
						}
					}
				}
			}
		}
		return false;
	}
	
	

	public static boolean xeque(CorPeca cor, Celula[][] celulas) {			
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {
				Peca peca = celulas[x][y].getPeca();
				if(peca != null && peca.getCor() == cor){
					if(xeque(celulas[x][y], celulas)){
						return true;
					}
				}
			}
		}
		return false;
	}


	public static void imprimir(Celula[][] celulas) {
		for (int i = 0; i < 8; i++) {
			String linha = "";
			for (int j = 0; j < 8; j++) {
				linha += getFormato(celulas[i][j].getPeca() == null ? null : celulas[i][j].getPeca().getNome()) + " ";
			}
			System.out.println(linha);
		}
	}
	
	private static String getFormato(String string) {
		if(string == null){
			return "    .     ";
		}
		while (string.length() < 10) {
			string += " ";
		}
		return string;	
			
		
	}


	public static int pontos(CorPeca cor, Celula[][] celulas) {
		int soma = 0;
		for (int x = 0; x < 8; x++) {
			for (int y = 0; y < 8; y++) {				
					if(celulas[x][y].getPeca() != null && celulas[x][y].getPeca().getCor() == cor){
						soma += Robo.pesoPeca(celulas[x][y].getPeca());
				}
			}
		}
		return soma;
	}

}
